package com.qin.config;

import com.qin.properties.NettyProperties;
import com.qin.service.LogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 定义一个自动配置类。满足条件的Bean将会被实例化到Spring容器中去
 *
 * 说明：
 *  1. EnableConfigurationProperties：该注解是用来开启对ConfigurationProperties 注解配置Bean的支持。也就是
 *     EnableConfigurationProperties注解告诉Spring Boot 能支持@ConfigurationProperties；
 *  2. ConditionalOnProperty 注解控制Configuration 是否生效。简单来说也就是我们可以通过在yml配置文件中控制Configuration
 *     注解的配置类是否生效。例如，本例中只有 qin.log.open = true 时这个配置类才会生效
 *
 * @author qinxh
 * @date 2020/08/12
 */
@Configuration
@EnableConfigurationProperties(NettyProperties.class)
@ConditionalOnProperty(
                prefix = "qin.log",
                name = "open",
                havingValue = "true"
)
public class LogConfig {

    @Autowired
    private NettyProperties nettyProperties;

    /**
     * 我们将LogService类定义为一个Bean，交给Ioc容器
     *
     * 说明：
     *  ConditionalOnMissingBean(AnimalService.class)注解表示容器中没有LogService这个Bean的时候才注入这个Bean
     */
    @Bean
    @ConditionalOnMissingBean(LogService.class)
    public LogService animalService() {

        return new LogService(nettyProperties.getIp(), nettyProperties.getPort());
    }
}
